package tools;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Collections;

/**
 * @author Livi Luo
 * 代码生成器
 */
public class Generator {

    private static final String ROOT_PATH = System.getProperty("user.dir");//获取项目路径

    private static final String URL = "jdbc:mysql://192.168.1.109:23306/webtools";
    private static final String USER_NAME = "livi";
    private static final String PASSWORD = "123456";
    private static final String AUTHOR = "Livi Luo";//作者
    private static final String OUT_PATH = ROOT_PATH + "/src/main/java";//生成java类路径
    private static final String XML_PATH = ROOT_PATH + "/src/main/resources/mybatis/mapper";//xml生成路径
    private static final String PACKAGE_NAME = "tools.generator";//父包名
    private static final String[] TABLES = new String[]{"user", "file"};// 需要生成的表名
    private static final String ENTITY_NAME = "%sEntity"; //实体后缀
    private static final String CONTROLLER_NAME = "%sController";//控制层后缀
    private static final String MAPPER_NAME = "%sMapper";//mapper后缀
    private static final String XML_NAME = "%sMapper";//xml后缀

    public static void main(String[] args) {
        FastAutoGenerator.create(URL, USER_NAME, PASSWORD).globalConfig(builder -> {
                    builder.author(AUTHOR) // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .disableOpenDir()//禁止打开输出目录
                            .outputDir(OUT_PATH); // 指定输出目录
                }).packageConfig(builder -> {
                    builder.parent(PACKAGE_NAME) // 设置父包名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, XML_PATH)); // 设置mapperXml生成路径
                }).strategyConfig(builder -> {
                    builder.addInclude(TABLES);// 设置需要生成的表名
                }).strategyConfig(builder -> {
                    builder.entityBuilder()//Entity 策略配置
                            .enableLombok()//开启 lombok 模型
                            .enableChainModel()//开启链式模型
                            .idType(IdType.AUTO)//全局主键类型
                            .enableTableFieldAnnotation()//开启生成实体时生成字段注解
                            .addTableFills(new Column("create_date", FieldFill.INSERT))//插入自动填入时间
                            .addTableFills(new Column("update_date", FieldFill.INSERT_UPDATE))//更新自动填入时间
                            .formatFileName(ENTITY_NAME);//格式化文件名称
                }).strategyConfig(builder -> {
                    builder.controllerBuilder()//Controller 策略配置
                            .enableRestStyle()//开启生成@RestController 控制器
                            .formatFileName(CONTROLLER_NAME);//格式化文件名称
                }).strategyConfig(builder -> {
                    builder.mapperBuilder()//Mapper 策略配置
                            .enableBaseResultMap()//启用 BaseResultMap 生成
                            .enableBaseColumnList()//启用 BaseColumnList
                            .enableMapperAnnotation()//开启 @Mapper 注解
                            .formatMapperFileName(MAPPER_NAME)//格式化 mapper 文件名称
                            .formatXmlFileName(XML_NAME);//格式化 xml 实现类文件名称
                }).templateEngine(new FreemarkerTemplateEngine())// 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();//执行
    }
}
